Function.prototype.mycall = (context, ...args) => {
  context = context || window;
  context.fn = this;
  const result = context.fn(...args);
  delete context.fn;
  return result;
}

function fn1() { console.log(1) };
function fn2() { console.log(2) };

fn1.mycall(fn2);
fn1.mycall.mycall(fn2);
// 相当于是 Function.mycall.mycall(fn2)
// 假设 x = fn1.mycall
// 那么 fn1.mycall.mycall(fn2) ===> x.mycall(fn2)
// 调用mycall后进入mycall函数 context = fn2
// context.fn = x = fn1.mycall = Function.mycall
// context.fn() = fn2.(fn1.mycall) = fn2.mycall()
// 相当于是 fn2 调用了 mycall 并且没传参